package fr.miage.resources;

import java.io.IOException;
import java.util.List;

import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

import org.apache.log4j.Logger;
import org.codehaus.jackson.JsonGenerationException;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;

import fr.miage.dao.EventDAO;
import fr.miage.model.Event;

@Path("/event")
public class EventResource {
		
	private EventDAO eventDAO = new EventDAO();
	private Logger logger = Logger.getRootLogger();
	
	@GET
	@Path("/{id : [0-9]+}")
	@Produces(MediaType.APPLICATION_JSON)
	public Response getEvent(@PathParam("id") String id){
		Event evenement = eventDAO.getById(id);
		ObjectMapper mapper = new ObjectMapper();
		if(evenement == null){
			return Response.status(404).build();
		}else{
			String fluxJson;
			try {
				fluxJson = mapper.writeValueAsString(evenement);
				return Response.ok(fluxJson).build();
			} catch (JsonGenerationException e) {
				logger.error(e);
				return Response.status(500).build();
			} catch (JsonMappingException e) {
				logger.error(e);
				return Response.status(500).build();
			} catch (IOException e) {
				logger.error(e);
				return Response.status(500).build();
			}
		}
	}
	
	@GET
	@Produces(MediaType.APPLICATION_JSON)
	public Response getAllEventsByUser(@QueryParam("idUser") String idUser){
		List<Event> listeEvenements = eventDAO.getAllByUser(idUser);
		ObjectMapper mapper = new ObjectMapper();
		if(listeEvenements == null){
			return Response.status(404).build();
		}else if(listeEvenements.size() == 0){
			return Response.status(204).build();
		}else{
			String fluxJson;
			try {
				fluxJson = mapper.writeValueAsString(listeEvenements);
				return Response.ok(fluxJson).build();
			} catch (JsonGenerationException e) {
				logger.error(e);
				return Response.status(500).build();
			} catch (JsonMappingException e) {
				logger.error(e);
				return Response.status(500).build();
			} catch (IOException e) {
				logger.error(e);
				return Response.status(500).build();
			}
		}
	}	
	
	@PUT
	@Consumes(MediaType.APPLICATION_JSON)
	@Produces(MediaType.APPLICATION_JSON)
	public Response addEvent(Event event) {
		if (event == null) {
			return Response.status(400).entity("Event n'est pas correctement formé").build();
		}else{
			if(!event.getIntitule().matches("[a-zA-Z 0-9-<>\\.]+")){
				return Response.status(400).entity("L'intitule contient des caractères non autorisés").build();
			}
			if(!event.getTypeEvent().matches("[a-zA-Z]+")){
				return Response.status(400).entity("Le type event contient des caractères non autorisés").build();
			}
			if(!event.getDate().matches("^[0-9]{4}[/-]((0[1-9])|(1[0-2]))[/-][0-3][0-9]$")){
				return Response.status(400).entity("Le format de la date est incorrect (AAAA/MM/JJ) ou (AAAA-MM-JJ)").build();
			}
			int nbRes = eventDAO.addEvent(event);
			if(nbRes != 1){
				return Response.status(400).entity("Les paramètres entrés sont incorrects (clés étrangères non respectées ou event existe déjà)").build();
			}else{
				return Response.ok().build();
			}
		}
	}
	
	@DELETE
	@Path("/{id:[0-9]+}")
	@Consumes(MediaType.APPLICATION_JSON)
	@Produces(MediaType.APPLICATION_JSON)
	public Response deleteEvent(@PathParam(value="id") String id){
		int nbRes = eventDAO.delete(id);
		if(nbRes != 1){
			return Response.status(400).entity("Les paramètres entrés sont incorrects (id inexistant ?)").build();
		}else{
			return Response.ok().build();
		}
	}
}
